///  1.子类继承父类可见的属性与方法,不会继承构造函数
///  2.可以复写父类的getter、setter方法
///
///  继承的执行顺序
///   1.先执行子类 initializer list，但只初始化自己的成员变量
///   2.初始化父类的成员变量（所以推荐把super 放到initializer list之后）
///   3.执行父类构造函数的函数体
///   4.执行子类构造函数的函数体
///
///  dart也是单继承，但是提供了with关键字一定程度实现了多继承
void main() {
  /* var a = Dog("水水", 12);
  a.printInfo();*/

  Dog d = Dog("shuis", 12);
  d.desc = "fauks";
  print(d.desc);
}

class Animal {
  String name = "dog";

  Animal(this.name);

  void printInfo() {
    print('I am $name');
  }
}

//子类不会继承父类的构造方法，需要子类实现父类的构造方法
//dart是单继承的，但是 dart有 mixins特性 使用关键字with 可以实现类似多继承
//作为mixins的类，不能有构造函数，一个类可以mixins多个mixins类，mixins类必须是继承Object的
//mixins类中如果有相同的方法 后面的会替换前面的方法，如果继承与mixins类有相同方法 后面的也会替换前面的
//mixins不是继承 也不是接口，而是全新特性

class Dog extends Animal /*with Object*/ {
  num age;

  String _desc;

  //getter方法
  /*String get desc {
    return this._desc;
  }*/

  //getter方法简写为lambda
  String get desc => _desc;

  //setter方法
  void set desc(String value) {
    _desc = value;
  }

  /*setter方法简化为lambda写法*/
  /* void set desc(String value) => desc = value;*/

  //父类的构造参数只能在initializer list 里调用
  Dog(String name, num age)
      : age = age,
        super(name);

  @override
  void printInfo() {
    print('dog $name,年龄为 $age');
  }

  @override
  String toString() {
    return "dog的名称$name,年龄$age";
  }
}
